/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.fornecedor;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import model.daoimpl.GenericDAO;
import model.dao.IRepositorioFornecedor;
import model.excecoes.ErroDAOException;
/**
 *
 * @author Marcos
 */
public class RepositorioFornecedor extends GenericDAO<Fornecedor> implements IRepositorioFornecedor{

    
    @Override
    public void alterar(Fornecedor fornecedor)throws ErroDAOException, PersistenceException{
        
        Fornecedor o = this.getManager().find(Fornecedor.class, fornecedor.getCodigo());
        o.setRazaoSocial(fornecedor.getRazaoSocial());
        o.getEndereco().setRua(fornecedor.getEndereco().getRua());
        o.getEndereco().setCidade(fornecedor.getEndereco().getCidade());
        o.getEndereco().setBairro(fornecedor.getEndereco().getBairro());
        o.getEndereco().setCep(fornecedor.getEndereco().getCep());
        o.getEndereco().setComplemento(fornecedor.getEndereco().getComplemento());
        o.getEndereco().setUf(fornecedor.getEndereco().getUf());
        o.setCnpj(fornecedor.getCnpj());
        o.getContato().setTelefone(fornecedor.getContato().getTelefone());
        o.getContato().setCelular(fornecedor.getContato().getCelular());
        o.getContato().setEmail(fornecedor.getContato().getEmail());
        super.alterar(o);
    }
    
    @Override
    public void excluir(Fornecedor fornecedor)throws ErroDAOException, PersistenceException{
        Fornecedor o = this.getManager().find(Fornecedor.class, fornecedor.getCodigo());
        super.excluir(o);
    }
    
    @Override
    public boolean verificarExistencia(String razaoSocial, String cnpj) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;
        
        
        try{
            Query query = this.getManager().createQuery("Select o From Fornecedor o Where o.razaoSocial = :razao_Social and o.cnpj = :cnpj");
            query.setParameter("razao_Social", razaoSocial);
            query.setParameter("cnpj", cnpj);
            if(!query.getResultList().isEmpty()){
                verificar = true;
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        return verificar;
    }

    @Override
    public int identificarCodigoProduto(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        int codigo = 0;
        
        try{
            Query query = this.getManager().createQuery("Select p.codigo From Produto p Where p.descricao = :descricao and p.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            
            if(!query.getResultList().isEmpty()){
                codigo = query.getFirstResult();
            }
            
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        return codigo;
    }

    @Override
    public List<Fornecedor> listarFornecedor(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<Fornecedor> fornecedores = null;
        Query query = null;
        
        try{
            if(consulta.equals("Todos") && campo.equals("Todos")){
                query = this.getManager().createQuery("Select o From Fornecedor o");
            }else{
                if(campo.equals("Código")){
                    query = this.getManager().createQuery("Select o From Fornecedor o Where o.codigo = :codigo");
                    query.setParameter("codigo", Integer.parseInt(consulta));
                }else{
                    if(campo.equals("Razão Social")){
                        query = this.getManager().createQuery("Select o From Fornecedor o Where o.razaoSocial = :razaoSocial");
                        query.setParameter("razaoSocial", consulta);
                    }else{
                        if(campo.equals("CNPJ")){
                            query = this.getManager().createQuery("Select o From Fornecedor o Where o.cnpj = :cnpj");
                            query.setParameter("cnpj", consulta);
                        }
                    }
                }
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        fornecedores = query.getResultList();
        return fornecedores;
    }
    
}
